package com.cfp4cloud.cfp.knowledge.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cfp4cloud.cfp.common.core.constant.enums.YesNoEnum;
import com.cfp4cloud.cfp.common.core.util.R;
import com.cfp4cloud.cfp.knowledge.entity.AiModelEntity;
import com.cfp4cloud.cfp.knowledge.mapper.AiModelMapper;
import com.cfp4cloud.cfp.knowledge.service.AiModelService;
import com.cfp4cloud.cfp.knowledge.support.provider.ModelProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;

/**
 * AI模型配置服务实现类
 * <p>
 * 管理AI模型的配置信息 支持模型的增删改查和同步操作 维护每种类型的默认模型设置
 *
 * @author cfp
 * @date 2024-09-27 23:37:54
 */
@Service
@RequiredArgsConstructor
public class AiModelServiceImpl extends ServiceImpl<AiModelMapper, AiModelEntity> implements AiModelService {

	/**
	 * 模型提供者 管理模型实例的生命周期
	 */
	private final ModelProvider modelProvider;

	/**
	 * 保存新模型
	 * <p>
	 * 自动处理默认模型设置 确保每种类型只有一个默认模型
	 * @param aiModel AI模型实体
	 * @return 操作结果
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public R saveModel(AiModelEntity aiModel) {
		setDefaultModel(aiModel);
		baseMapper.insert(aiModel);
		return null;
	}

	/**
	 * 同步模型缓存
	 * <p>
	 * 清空模型缓存以重新加载 用于模型配置更新后的刷新
	 * @return 操作成功响应
	 */
	@Override
	public R syncModel() {
		modelProvider.clearModels();
		return R.ok();
	}

	/**
	 * 更新模型配置
	 * <p>
	 * 更新后清理对应的模型缓存 自动处理默认模型切换
	 * @param aiModel AI模型实体
	 * @return 操作成功响应
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public R updateModel(AiModelEntity aiModel) {
		setDefaultModel(aiModel);
		baseMapper.updateById(aiModel);
		modelProvider.delete(aiModel.getName());
		return R.ok();
	}

	/**
	 * 批量删除模型
	 * <p>
	 * 删除前清理每个模型的缓存 确保资源正确释放
	 * @param idList 模型ID列表
	 * @return 操作成功响应
	 */
	@Override
	public R removeModel(ArrayList<Long> idList) {
		idList.stream().forEach(id -> {
			AiModelEntity aiModelEntity = baseMapper.selectById(id);
			modelProvider.delete(aiModelEntity.getName());
		});
		baseMapper.deleteBatchIds(idList);
		return R.ok();
	}

	/**
	 * 设置默认模型
	 * <p>
	 * 当新模型设为默认时 自动取消同类型的其他默认模型 确保每种类型只有一个默认模型
	 * @param aiModel 待设置的AI模型
	 */
	private void setDefaultModel(AiModelEntity aiModel) {
		if (aiModel.getDefaultModel().equals(YesNoEnum.YES.getCode())) {
			AiModelEntity aiModelEntity = new AiModelEntity();
			aiModelEntity.setDefaultModel(YesNoEnum.NO.getCode());
			baseMapper.update(aiModelEntity,
					Wrappers.<AiModelEntity>lambdaUpdate()
						.eq(AiModelEntity::getModelType, aiModel.getModelType())
						.eq(AiModelEntity::getDefaultModel, YesNoEnum.YES.getCode()));
		}
	}

}
